const { resolve } = require('path')

const { jgcl } = require(resolve(__dirname, '../../utils/utils'))
const Tags = require(resolve(__dirname, '../../database/dbModule/tags'))

// 查询标签
const selectTag = async (ctx) => {
  const data = ctx.query
  const {
    name = null,
    pageNum = 1, // 页数
    pageSize = 10, // 数据条数
  } = data

  try {
    const dataNum = await Tags.find({ isDel: false }).count()
    if (name === null || name === '') {
      const findRes = await Tags.find({ isDel: false })
        .skip(pageSize * (pageNum - 1))
        .limit(pageSize)

      if (findRes === null) {
        jgcl(ctx, 2015, '标签数据为空!')
      } else {
        jgcl(ctx, 200, '查询成功!', { total: dataNum, list: findRes })
      }
    } else {
      const findRes = await Tags.find(
        {
          tagName: { $regex: new RegExp(name) },
          isDel: false
        }
      ).skip(pageSize * (pageNum - 1))
        .limit(pageSize)

      if (findRes.length === 0) {
        jgcl(ctx, 2012, '标签数据为空!')
      } else {
        jgcl(ctx, 200, '查询成功!', { total: dataNum, list: findRes })
      }
    }

  } catch (err) {
    jgcl(ctx, 2014, '查询失败!', { err })
  }

}

// 查询标签数量
const selectTagTotal = async (ctx) => {
  try {
    const num = await Tags.find({ isDel: false, tagStatus: true }).count()

    jgcl(ctx, 200, '查询成功!', { total: num })
  } catch (err) {
    jgcl(ctx, 2014, '查询失败!', { err })
  }
}

// 添加标签
const addTag = async (ctx) => {
  const data = ctx.request.body
  const {
    tagName = '',
    tagCreateTime = new Date().getTime(),
    updateTime = 0,
    tagStatus = true,
    articleNum = 0,
    isDel = false
  } = data

  try {
    const findRes = await Tags.findOne({ tagName, isDel: false })
    if (findRes === null) {
      const addRes = await Tags.create({
        tagName,
        tagCreateTime,
        updateTime,
        tagStatus,
        articleNum,
        isDel
      })
      jgcl(ctx, 200, '标签添加成功!', addRes.tagName)
    } else {
      jgcl(ctx, 2010, '标签已存在!', findRes.tagName)
    }
  } catch (err) {
    const rej = Object.keys(err.errors)[0]
    if (rej === 'tagName') {
      jgcl(ctx, 2009, '标签添加失败!', err.errors[rej].properties.message)
    } else {
      jgcl(ctx, 2011, '标签添加失败!', err)
    }
  }
}

// 修改标签
const updateTag = async (ctx) => {
  const data = ctx.request.body
  const {
    id,
    tagName,
    updateTime = new Date().getTime()
  } = data
  console.log(data)

  try {
    const findRes = await Tags.findOne({ _id: id, isDel: false })
    if (findRes !== null) {

      if (findRes.tagName === tagName) {
        jgcl(ctx, 2010, '标签已存在')
      } else {
        // 修改
        const upRes = await Tags.updateOne(
          { _id: id },
          {
            tagName,
            updateTime
          }
        )
        if (upRes.modifiedCount === 1) {
          jgcl(ctx, 200, '修改成功', { modifiedCount: upRes.modifiedCount })
        } else {
          jgcl(ctx, 2013, '修改失败')
        }
      }
    } else {
      jgcl(ctx, 2012, '标签不存在！')
    }
  } catch (err) {
    jgcl(ctx, 2013, '修改失败', { err })

  }
}

// 修改标签状态
const updateTagStatus = async (ctx) => {
  const data = ctx.request.body
  const {
    id,
    tagStatus,
    updateTime = new Date().getTime()
  } = data

  try {
    const findRes = await Tags.findOne({ _id: id, isDel: false })
    if (findRes === null) {
      jgcl(ctx, 2012, '标签不存在', err)
    } else {
      const upRes = await Tags.updateOne(
        { _id: id },
        {
          tagStatus,
          updateTime
        }
      )
      if (upRes.modifiedCount === 1) {
        jgcl(ctx, 200, '修改成功', { modifiedCount: upRes.modifiedCount })
      } else {
        jgcl(ctx, 2013, '修改失败')
      }
    }

  } catch (err) {
    jgcl(ctx, 2013, '状态修改失败', err)

  }
}

// 删除标签
const delTags = async (ctx) => {
  const data = ctx.request.body
  const { id } = data

  try {
    const findRes = await Tags.findOne({ _id: id, isDel: false })

    if (findRes === null) {
      jgcl(ctx, 2012, '标签不存在!')
    } else {
      const delRes = await Tags.updateOne({ _id: id }, { isDel: true })
      if (delRes.modifiedCount === 1) {
        jgcl(ctx, 200, '标签删除成功!', { modifiedCount: delRes.modifiedCount })
      } else {
        jgcl(ctx, 2016, '标签删除失败!', delRes)
      }
    }
  } catch (err) {
    jgcl(ctx, 2016, '标签删除失败!', { err })
  }

}


module.exports = {
  addTag,
  updateTag,
  delTags,
  selectTag,
  updateTagStatus,
  selectTagTotal
}